# model/data_store.py
from collections import defaultdict


class DataStore:
    """
    应用程序的全局数据存储中心，用于管理爬虫采集结果、UI状态、缓存等。
    所有数据通过平台（platform）和采集类型（ctype）进行组织。
    """

    def __init__(self):
        # 存储已采集的数据项，结构：{platform: {ctype: [item1, item2, ...]}}
        self.collected_links = defaultdict(lambda: defaultdict(list))

        # 缓存各平台页面或接口返回的原始内容（如HTML、JSON），避免重复请求
        self.platform_content_cache = {}

        # 存储各数据展示区域对应的 Treeview 控件引用，key 通常为 (platform, ctype)
        self.trees = {}

        # 去重设置，按平台或任务维度配置是否启用去重
        self.dedup_settings = {}

        # 存储分类复选框的 Tkinter BooleanVar 变量，用于同步 UI 与逻辑状态
        # 键格式：(platform, ctype)，值：{category_name: BooleanVar}
        self.category_vars = {}

    def get_items(self, platform: str, ctype: str) -> list:
        """
        获取指定平台和采集类型下的所有已采集数据项。

        :param platform: 平台名称，如 '淘宝'、'京东'
        :param ctype: 采集类型，如 '关键词采集'、'商品采集'
        :return: 数据项列表，每个 item 为 dict 类型
        """
        return self.collected_links[platform][ctype]

    def add_item(self, platform: str, ctype: str, item: dict):
        """
        向指定平台和采集类型的列表中添加一个新数据项。

        :param platform: 平台名称
        :param ctype: 采集类型
        :param item: 要添加的数据项（字典格式）
        """
        self.collected_links[platform][ctype].append(item)

    def clear_items(self, platform: str, ctype: str):
        """
        清空指定平台和采集类型下的所有已采集数据。

        :param platform: 平台名称
        :param ctype: 采集类型
        """
        self.collected_links[platform][ctype].clear()

    def set_tree(self, key, tree):
        """
        保存 Treeview 控件的引用，便于后续更新或操作。

        :param key: 标识符，通常为 (platform, ctype) 元组
        :param tree: tkinter.ttk.Treeview 实例
        """
        self.trees[key] = tree

    def get_tree(self, key):
        """
        根据 key 获取对应的 Treeview 控件。

        :param key: 标识符，如 ('淘宝', '关键词采集')
        :return: Treeview 实例，若不存在则返回 None
        """
        return self.trees.get(key)